﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;


namespace CRCDesktop.org.h1.crcDesktop.util
{
    /**
     * 		Esta classe é reponsável pela comunicação de "baixo nível", 
     * como o protocolo USB e funcionamento interno do módulo é tratado pela DLL.
     * 
     * 		Para as funções que configuram / alteram dados das portas, 
     * sempre é utilizado um parâmetro / variável / número inteiro de 0 a 511, 
     * que representa as 9 portas. Ex. Desligartodas as portas: “SetOutputPorts(0)” , 
     * 0 decimal é igual ao binário: 000000000 (DIO9 a DIO0). Para ligar somente a 
     * porta DIO1: “SetOutputPorts(2)”, 2 decimal é igual a: 000000010. No inicio da aplicação 
     * ou na conexão ou desconexão de qualquer dispositivo a função “SearchDevices” deve ser 
     * chamada para a correta enumeração e identificação dos módulos. O parâmetro “dev” 
     * representa o número do dispositivo conectado. Por ex: Para habilitar 
     * o PWM no módulo n° 0 : “SetPWM(0,15,511)” As funções e parâmetros utilizadas 
     * por elas devem ser declaradas na plataforma utilizada. Abaixo segue como declarar 
     * as funções e seus parâmetros (exemplo de declaração em VB).  
     * 
     */
    public class EasyLabLibrary
    {

        public EasyLabLibrary()
        { 

        }

        /**
	     * - Enumera e retorna o numero de Dispositivos conectados (Soma binária).
	     * 
	     * @param nDevs - Total de Dispositivos conectados
	     * @return
	     */
        [DllImport("Easy_Lab.dll")]
        public static extern int SearchDevices(out byte nDevs);

        /**
         * - Configura cada porta como entrada ou saída.
         * 
	     * @param dev
	     * @param ddr - valor de 0 a 511, que representa a direção das 9 portas. 
	     * 				Ex: se ddr = 511, todas as portas estão como saída.
	     * @return
	     */
        [DllImport("Easy_Lab.dll")]
        public static extern int SetPortDirections(byte dev, int ddr);

        /**
	     * - Aciona os estados Alto ou Baixo de cada porta.
	     * 
	     * @param dev
	     * @param dataout - valor entre 0 a 511 que ativa ou não os estados das portas. 
	     * 					Ex. Dataout = 511, todas as portas ativarão em “Alto”.
	     * @return
	     */
        [DllImport("Easy_Lab.dll")]
        public static extern int SetOutputPorts(byte dev, int DataOut);

        /**
	     * - Retorna o estado real (alto / baixo) das portas;
	     * 
	     * @param dev
	     * @param dataIn
	     * @return Retorna um valor de 0 a 511 na variável Datain representando o estado real 
	     * 		   das portas. Ex: Todas as portas em alto, Datain = 511.
	     */
        [DllImport("Easy_Lab.dll")]
        public static extern int GetInPorts(byte dev, out int dataIn);

        /**
	     * - Retorna o estado enviado (alto / baixo) das portas
	     * 
	     * @param dev
	     * @param dataout
	     * @return retorna um valor de 0 a 511 na variável Dataout a configuração realizada pelo 
	     * 		   função “SetOutputPorts”
	     */
        [DllImport("Easy_Lab.dll")]
        public static extern int GetOutPorts(byte dev, out int dataout);

        /**
	     * - Aciona / Desliga PWM com parâmetros de freqüência e DutyCycle.
	     * 
	     * @param div
	     * @param duty
	     * @return 	retorna em “div” a freqüência dos pulsos e em “counter” a quantidade de		
	     * 		   	pulsos medidos. Para se ter o valor da freqüência em hz, o valor armazenado em
	     * 		   	“freq” deve ser transformado conforme: F(hz) = 1500000/freq.
	     */
        [DllImport("Easy_Lab.dll")]
        public static extern int SetPWM(byte dev, byte div, int duty);

        /**
	     * - Habilita frequencimetro e contador de pulsos.
	     * 
	     * @param dev
	     * @param freq - valor entre 0 e 2, Icen=2 desabilita ICP (frequencimetro), Icen=0 ativa ICP, Icen=1 (não utilizar).
	     * @return
	    */
        [DllImport("Easy_Lab.dll")]
        public static extern int Icen(byte dev, int freq);

        /**
         * - Retorna valor de freqüência e pulsos.
         * Obs: Para utilizar esta função o ICP deve estar habilitado (chamar função: “Icen(dev,0)).
         * 
         * @param freq
         * @param counter
         * @return 	retorna em “freq” a freqüência dos pulsos e em “counter” a quantidade de
         * 			pulsos medidos. Para se ter o valor da freqüência em hz, o valor armazenado em
         * 			“freq” deve ser transformado conforme: F(hz) = 1500000/freq.
         */
        [DllImport("Easy_Lab.dll")]
        public static extern int DoGetIcp(byte dev, out int Freq, out int count);
    }
}
